#ifndef MAIN_H
#define MAIN_H
#include <QAbstractButton>
#include <QObject>
#include <QString>
#include <QVector>

// 三层设计，就很合适
namespace design {
namespace semantic {
    enum class SemanticPrimary { Main, Light, Dark, OnPrimary };
    enum class SemanticSurface { Default, Elevated, OnSurface };
    enum class SemanticError { Main, Light, Dark, OnError };
}
namespace button {
    enum class Background { Normal, Hover, Pressed, Disabled };
    enum class Text { Normal, Hover, Pressed, Disabled };
}
namespace input {
    enum class InputBackground { Normal, Focused, Error, Disabled };
}
namespace functional {
    enum class Link { Normal, Visited, Active };
}
}

#include <memory>
//? 到底是让各个控件从 ThemeManger 的方法中获取颜色属性
//? 还是让各个控件注册到 ThemeManger 中，ThemeManger 通过 update 方法输入颜色属性

// ThemeManager 的作用是管理自定义控件的颜色
class ThemeManager {
public:
    // 我们应该用 yaml 文件统一管理颜色，而不是在代码中设置
    ThemeManager(const QString& theme = "default");
    // 我希望每个自定义的每个控件都要实现 updateTheme 方法
    void applyTheme(const QString& theme = "default");
    // 绑定 QWidget 按照设置的 Theme 对其可变颜色进行修改
    void registerWidget(QWidget*);

private:
    struct Impl;
    std::unique_ptr<Impl> pimpl_;
};

// 状态 + 属性 + 时长 + 缓动函数 + 延迟
// 考虑到动画能被各种按键复用，单独成类
class XXXButtonAnimator : QObject {
    Q_OBJECT
};

// 头文件中还可以使用 using 哦
using ButtonBackGround = design::button::Background;
using ButtonText       = design::button::Text;

#include <QColor>
#include <QIcon>
#include <memory>
// 创造 Button 时
// 1. 继承 QAbstractButton
// 2. Q_OBJECT
// 3. 组合 ButtonAnimator QIcon
// 4. 依赖 ButtonTheme
// 5. Q_PROPERTY 暴露属性
class QPaintEvent;
class IconButton : QAbstractButton {
    Q_OBJECT
public:
    IconButton(QWidget* parent = nullptr);
    ~IconButton();

protected:
    void paintEvent(QPaintEvent* event) override;

private:
    XXXButtonAnimator animator_ {};
    QIcon icon_ {};
    QColor normal {};
    QColor hover {};
    QColor focused {};
    QColor pressed {};
    QColor disabled {};
};
#endif // MAIN_H